package de.reichelt.fx;

import java.util.logging.Logger;


/**
 * Die FxPosBox legt die Position und die Größe des Rechtecks fest, in dem ein FxElement 
 * darstellbar ist. Standardmäßig beginnt die PosBox bei 0 oder bei vorher schon erzeugten
 * PosBoxen hinter der letzen horizontalen Endeposition. Über absolute oder relative Angaben
 * kann die PosBox verschoben werden.
 * 
 * @author dieter
 */
public class FxPosBox {
  private Double top;
  private Double bottom;
  private Double left;
  private Double right;
  private Logger log;

  private FxPosBox() {
    log = Logger.getLogger(this.getClass().getName());
  }

  /**
   * definiert Positionen für einen Darstellungsbereich.
   * 
   * @param top
   * @param bottom
   * @param left
   * @param right 
   */
  public FxPosBox(Double top, Double bottom, Double left, Double right) {
    this();
    this.top = top;
    this.bottom = bottom;
    this.left = left;
    this.right = right;
  }
  
  /**
   * definiert Positionen für einen  Darstellungsbereich. In pos können verschiedene 
   * textuelle Angaben gemacht werden.<br/>
   * * l[+|-]nn  links [relativ] in Pixels<br/>
   * * t[+|-]nn  oben [relativ] in Pixels<br/>
   * * rnn  rechts in Pixels<br/>
   * * bnn  untern in Pixels
   * 
   * @param pos  Positionsangaben, auch relativ
   * @param actual  bisherige Position; diese Position wird neu berechnet; dazu müssen aber l und t angegeben werden, z.B. l+0t+0
   */
  public FxPosBox(String pos, FxPos actual) {
    this();
    log.fine("FxPosBox() pos="+pos);
    //top
    String p = "";
    p = (pos.matches("^.*t.*$"))?pos.replaceFirst("^.*t([\\+\\-\\d\\.]*).*$", "$1"):"";
    if (p.startsWith("+")) {
      log.fine("p="+p+", actual="+actual);
      top = actual.getY()+new Double(p.substring(1));
    } else if (p.startsWith("-")) {
      top = actual.getY()-new Double(p.substring(1));
    } else if (!p.isEmpty()) {
      top = new Double(p);
    }
    //bottom
    p = (pos.matches("^.*b.*$"))?pos.replaceFirst("^.*b([\\d\\.]*).*$", "$1"):"";
    if (!p.isEmpty()) {
      bottom = new Double(p);
    }
    //left
    p = (pos.matches("^.*l.*$"))?pos.replaceFirst("^.*l([\\+\\-\\d\\.]*).*$", "$1"):"";
    if (p.startsWith("+")) {
      left = actual.getX()+new Double(p.substring(1));
    } else if (p.startsWith("-")) {
      left = actual.getX()-new Double(p.substring(1));
    } else if (!p.isEmpty()) {
      left = new Double(p);
    }
    //right
    p = (pos.matches("^.*r.*$"))?pos.replaceFirst("^.*r([\\d\\.]*).*$", "$1"):"";
    if (!p.isEmpty()) {
      right = new Double(p);
    }
    actual.setX(left);
    actual.setY(top);
  }

  public Double getTop() {
    return top;
  }

  public Double getBottom() {
    return bottom;
  }

  public Double getLeft() {
    return left;
  }

  public Double getRight() {
    return right;
  }
  
}
